{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_kg_hide-output": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/lightgbm/__init__.py:48: UserWarning: Starting from version 2.2.1, the library file in distribution wheels for macOS is built by the Apple Clang (Xcode_8.3.3) compiler.\n",
      "This means that in case of installing LightGBM from PyPI via the ``pip install lightgbm`` command, you don't need to install the gcc compiler anymore.\n",
      "Instead of that, you need to install the OpenMP library, which is required for running LightGBM on the system with the Apple Clang compiler.\n",
      "You can install the OpenMP library by the following command: ``brew install libomp``.\n",
      "  \"You can install the OpenMP library by the following command: ``brew install libomp``.\", UserWarning)\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import lightgbm as lgb\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.model_selection import KFold, StratifiedKFold, GroupKFold\n",
    "from tqdm import tqdm_notebook as tqdm\n",
    "import datetime\n",
    "# from meteocalc import feels_like, Temp\n",
    "from sklearn import metrics\n",
    "import gc\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Original code from https://www.kaggle.com/gemartin/load-data-reduce-memory-usage by @gemartin\n",
    "\n",
    "from pandas.api.types import is_datetime64_any_dtype as is_datetime\n",
    "from pandas.api.types import is_categorical_dtype\n",
    "\n",
    "def reduce_mem_usage(df, use_float16=False):\n",
    "    \"\"\"\n",
    "    Iterate through all the columns of a dataframe and modify the data type to reduce memory usage.        \n",
    "    \"\"\"\n",
    "    \n",
    "    start_mem = df.memory_usage().sum() / 1024**2\n",
    "    print(\"Memory usage of dataframe is {:.2f} MB\".format(start_mem))\n",
    "    \n",
    "    for col in df.columns:\n",
    "        if is_datetime(df[col]) or is_categorical_dtype(df[col]):\n",
    "            continue\n",
    "        col_type = df[col].dtype\n",
    "        \n",
    "        if col_type != object:\n",
    "            c_min = df[col].min()\n",
    "            c_max = df[col].max()\n",
    "            if str(col_type)[:3] == \"int\":\n",
    "                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n",
    "                    df[col] = df[col].astype(np.int8)\n",
    "                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n",
    "                    df[col] = df[col].astype(np.int16)\n",
    "                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n",
    "                    df[col] = df[col].astype(np.int32)\n",
    "                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n",
    "                    df[col] = df[col].astype(np.int64)  \n",
    "            else:\n",
    "                if use_float16 and c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n",
    "                    df[col] = df[col].astype(np.float16)\n",
    "                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n",
    "                    df[col] = df[col].astype(np.float32)\n",
    "                else:\n",
    "                    df[col] = df[col].astype(np.float64)\n",
    "        else:\n",
    "            df[col] = df[col].astype(\"category\")\n",
    "\n",
    "    end_mem = df.memory_usage().sum() / 1024**2\n",
    "    print(\"Memory usage after optimization is: {:.2f} MB\".format(end_mem))\n",
    "    print(\"Decreased by {:.1f}%\".format(100 * (start_mem - end_mem) / start_mem))\n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def features_engineering(df):\n",
    "    \n",
    "    # Sort by timestamp\n",
    "    df.sort_values(\"timestamp\")\n",
    "    df.reset_index(drop=True)\n",
    "    \n",
    "    # Add more features\n",
    "    df[\"timestamp\"] = pd.to_datetime(df[\"timestamp\"],format=\"%Y-%m-%d %H:%M:%S\")\n",
    "    df[\"hour\"] = df[\"timestamp\"].dt.hour\n",
    "    df[\"dayofweek\"] = df[\"timestamp\"].dt.dayofweek\n",
    "    \n",
    "    df['month'] = df['timestamp'].dt.month\n",
    "    df['month'].replace((1, 2, 3, 4), 1, inplace = True)\n",
    "    df['month'].replace((5, 6, 7, 8), 2, inplace = True)\n",
    "    df['month'].replace((9, 10, 11, 12), 3, inplace = True)\n",
    "  \n",
    "    df['square_feet'] =  np.log1p(df['square_feet'])\n",
    "    \n",
    "    # Remove Unused Columns\n",
    "    drop = [\"timestamp\"]\n",
    "    df = df.drop(drop, axis=1)\n",
    "    gc.collect()\n",
    "    \n",
    "    # Encode Categorical Data\n",
    "    le = LabelEncoder()\n",
    "    df[\"primary_use\"] = le.fit_transform(df[\"primary_use\"])\n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# feature engineering\n",
    "train_df = pd.read_csv('../../Large_output/train_df_new.csv')\n",
    "train_df = features_engineering(train_df)\n",
    "\n",
    "# transform target variable\n",
    "train_df['meter_reading'] = np.log1p(train_df[\"meter_reading\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# declare target, categorical and numeric columns\n",
    "target = 'meter_reading'\n",
    "categorical = ['building_id', 'site_id', 'primary_use', 'meter','dayofweek']\n",
    "numeric_cols = [col for col in train_df.columns if col not in categorical + [target, 'timestamp', 'month']]\n",
    "features = categorical + numeric_cols"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "79834674b42c48879236fd2012139e94",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, max=5), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.6/site-packages/lightgbm/basic.py:1243: UserWarning: Using categorical_feature in Dataset.\n",
      "  warnings.warn('Using categorical_feature in Dataset.')\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training until validation scores don't improve for 50 rounds\n",
      "[25]\ttraining's rmse: 1.21966\tvalid_1's rmse: 1.22397\n",
      "[50]\ttraining's rmse: 0.876588\tvalid_1's rmse: 0.895772\n",
      "[75]\ttraining's rmse: 0.748348\tvalid_1's rmse: 0.786597\n",
      "[100]\ttraining's rmse: 0.690031\tvalid_1's rmse: 0.745456\n",
      "[125]\ttraining's rmse: 0.654288\tvalid_1's rmse: 0.727667\n",
      "[150]\ttraining's rmse: 0.631523\tvalid_1's rmse: 0.719552\n",
      "[175]\ttraining's rmse: 0.615182\tvalid_1's rmse: 0.716205\n",
      "[200]\ttraining's rmse: 0.601543\tvalid_1's rmse: 0.713926\n",
      "[225]\ttraining's rmse: 0.589554\tvalid_1's rmse: 0.712322\n",
      "[250]\ttraining's rmse: 0.579262\tvalid_1's rmse: 0.711997\n",
      "[275]\ttraining's rmse: 0.570304\tvalid_1's rmse: 0.711743\n",
      "[300]\ttraining's rmse: 0.562908\tvalid_1's rmse: 0.711816\n",
      "[325]\ttraining's rmse: 0.556624\tvalid_1's rmse: 0.711945\n",
      "Early stopping, best iteration is:\n",
      "[284]\ttraining's rmse: 0.567472\tvalid_1's rmse: 0.711653\n",
      "Training until validation scores don't improve for 50 rounds\n",
      "[25]\ttraining's rmse: 1.20836\tvalid_1's rmse: 1.26993\n",
      "[50]\ttraining's rmse: 0.859724\tvalid_1's rmse: 0.970372\n",
      "[75]\ttraining's rmse: 0.730753\tvalid_1's rmse: 0.876208\n",
      "[100]\ttraining's rmse: 0.672542\tvalid_1's rmse: 0.842271\n",
      "[125]\ttraining's rmse: 0.638724\tvalid_1's rmse: 0.827575\n",
      "[150]\ttraining's rmse: 0.617242\tvalid_1's rmse: 0.820411\n",
      "[175]\ttraining's rmse: 0.602005\tvalid_1's rmse: 0.817456\n",
      "[200]\ttraining's rmse: 0.588957\tvalid_1's rmse: 0.815206\n",
      "[225]\ttraining's rmse: 0.578178\tvalid_1's rmse: 0.813632\n",
      "[250]\ttraining's rmse: 0.568516\tvalid_1's rmse: 0.813148\n",
      "[275]\ttraining's rmse: 0.560383\tvalid_1's rmse: 0.812817\n",
      "[300]\ttraining's rmse: 0.553698\tvalid_1's rmse: 0.81268\n",
      "[325]\ttraining's rmse: 0.547672\tvalid_1's rmse: 0.812682\n",
      "Early stopping, best iteration is:\n",
      "[284]\ttraining's rmse: 0.557637\tvalid_1's rmse: 0.812571\n",
      "Training until validation scores don't improve for 50 rounds\n",
      "[25]\ttraining's rmse: 1.21551\tvalid_1's rmse: 1.23678\n",
      "[50]\ttraining's rmse: 0.869649\tvalid_1's rmse: 0.924502\n",
      "[75]\ttraining's rmse: 0.741224\tvalid_1's rmse: 0.823157\n",
      "[100]\ttraining's rmse: 0.683227\tvalid_1's rmse: 0.785538\n",
      "[125]\ttraining's rmse: 0.648116\tvalid_1's rmse: 0.768986\n",
      "[150]\ttraining's rmse: 0.625067\tvalid_1's rmse: 0.760926\n",
      "[175]\ttraining's rmse: 0.60891\tvalid_1's rmse: 0.757418\n",
      "[200]\ttraining's rmse: 0.595234\tvalid_1's rmse: 0.754599\n",
      "[225]\ttraining's rmse: 0.583338\tvalid_1's rmse: 0.752864\n",
      "[250]\ttraining's rmse: 0.573176\tvalid_1's rmse: 0.752168\n",
      "[275]\ttraining's rmse: 0.564483\tvalid_1's rmse: 0.751754\n",
      "[300]\ttraining's rmse: 0.557245\tvalid_1's rmse: 0.751521\n",
      "[325]\ttraining's rmse: 0.550869\tvalid_1's rmse: 0.751431\n",
      "[350]\ttraining's rmse: 0.545941\tvalid_1's rmse: 0.751344\n",
      "[375]\ttraining's rmse: 0.541383\tvalid_1's rmse: 0.7514\n",
      "[400]\ttraining's rmse: 0.537535\tvalid_1's rmse: 0.751517\n",
      "Early stopping, best iteration is:\n",
      "[356]\ttraining's rmse: 0.544777\tvalid_1's rmse: 0.751329\n",
      "Training until validation scores don't improve for 50 rounds\n",
      "[25]\ttraining's rmse: 1.2218\tvalid_1's rmse: 1.22053\n",
      "[50]\ttraining's rmse: 0.880977\tvalid_1's rmse: 0.884498\n",
      "[75]\ttraining's rmse: 0.753792\tvalid_1's rmse: 0.769463\n",
      "[100]\ttraining's rmse: 0.695181\tvalid_1's rmse: 0.723792\n",
      "[125]\ttraining's rmse: 0.658878\tvalid_1's rmse: 0.703379\n",
      "[150]\ttraining's rmse: 0.635307\tvalid_1's rmse: 0.693405\n",
      "[175]\ttraining's rmse: 0.61859\tvalid_1's rmse: 0.688877\n",
      "[200]\ttraining's rmse: 0.604123\tvalid_1's rmse: 0.68556\n",
      "[225]\ttraining's rmse: 0.591984\tvalid_1's rmse: 0.683349\n",
      "[250]\ttraining's rmse: 0.581303\tvalid_1's rmse: 0.682454\n",
      "[275]\ttraining's rmse: 0.572411\tvalid_1's rmse: 0.682051\n",
      "[300]\ttraining's rmse: 0.564709\tvalid_1's rmse: 0.68174\n",
      "[325]\ttraining's rmse: 0.558192\tvalid_1's rmse: 0.681697\n",
      "[350]\ttraining's rmse: 0.552462\tvalid_1's rmse: 0.681666\n",
      "[375]\ttraining's rmse: 0.547449\tvalid_1's rmse: 0.681657\n",
      "[400]\ttraining's rmse: 0.542766\tvalid_1's rmse: 0.681783\n",
      "Early stopping, best iteration is:\n",
      "[353]\ttraining's rmse: 0.551823\tvalid_1's rmse: 0.681595\n",
      "Training until validation scores don't improve for 50 rounds\n",
      "[25]\ttraining's rmse: 1.21786\tvalid_1's rmse: 1.23096\n",
      "[50]\ttraining's rmse: 0.875486\tvalid_1's rmse: 0.903437\n",
      "[75]\ttraining's rmse: 0.747559\tvalid_1's rmse: 0.796179\n",
      "[100]\ttraining's rmse: 0.689024\tvalid_1's rmse: 0.756688\n",
      "[125]\ttraining's rmse: 0.653789\tvalid_1's rmse: 0.740598\n",
      "[150]\ttraining's rmse: 0.63076\tvalid_1's rmse: 0.733361\n",
      "[175]\ttraining's rmse: 0.614519\tvalid_1's rmse: 0.73054\n",
      "[200]\ttraining's rmse: 0.600648\tvalid_1's rmse: 0.728576\n",
      "[225]\ttraining's rmse: 0.588752\tvalid_1's rmse: 0.727335\n",
      "[250]\ttraining's rmse: 0.578068\tvalid_1's rmse: 0.726956\n",
      "[275]\ttraining's rmse: 0.569409\tvalid_1's rmse: 0.726962\n",
      "[300]\ttraining's rmse: 0.561915\tvalid_1's rmse: 0.727082\n",
      "[325]\ttraining's rmse: 0.555467\tvalid_1's rmse: 0.727169\n",
      "Early stopping, best iteration is:\n",
      "[284]\ttraining's rmse: 0.566637\tvalid_1's rmse: 0.726801\n",
      "\n",
      "Our oof cv is : 0.7380456904655424\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x1872 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "\n",
    "def run_lgbm(train, cat_features = categorical, num_rounds = 20000, folds = 5):\n",
    "    kf = StratifiedKFold(n_splits=folds, shuffle=False, random_state=2319)\n",
    "    models = []\n",
    "    feature_importance_df = pd.DataFrame()\n",
    "\n",
    "    param =  {'num_leaves': 3160,\n",
    "             'objective': 'regression',\n",
    "             'learning_rate': 0.03,\n",
    "             'boosting': 'gbdt',\n",
    "             'subsample': 0.5,\n",
    "             'feature_fraction': 0.7,\n",
    "             'n_jobs': -1,\n",
    "             'seed': 50,\n",
    "             'metric': 'rmse'\n",
    "              }\n",
    "    \n",
    "    oof = np.zeros(len(train))\n",
    "  \n",
    "    for tr_idx, val_idx in tqdm(kf.split(train_df,train_df['month']), total = folds):\n",
    "        tr_x, tr_y = train[features].iloc[tr_idx], train[target].iloc[tr_idx]\n",
    "        vl_x, vl_y = train[features].iloc[val_idx], train[target].iloc[val_idx]\n",
    "        tr_data = lgb.Dataset(tr_x, label = tr_y,  categorical_feature = categorical)\n",
    "        vl_data = lgb.Dataset(vl_x, label = vl_y,  categorical_feature = categorical)\n",
    "        clf = lgb.train(param, tr_data, num_rounds, valid_sets = [tr_data, vl_data], verbose_eval = 25, \n",
    "                        early_stopping_rounds = 50)\n",
    "        \n",
    "        fold_importance_df = pd.DataFrame()\n",
    "        fold_importance_df[\"feature\"] = features\n",
    "        fold_importance_df[\"importance\"] = clf.feature_importance()\n",
    "        \n",
    "        feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n",
    "        models.append(clf)\n",
    "        oof[val_idx] = clf.predict(vl_x)\n",
    "        gc.collect()\n",
    "    score = np.sqrt(metrics.mean_squared_error(train[target], np.clip(oof, a_min=0, a_max=None)))\n",
    "    print('Our oof cv is :', score)\n",
    "    \n",
    "    cols = (feature_importance_df[[\"feature\", \"importance\"]]\n",
    "        .groupby(\"feature\")\n",
    "        .mean()\n",
    "        .sort_values(by=\"importance\", ascending=False)[:20].index)\n",
    "    best_features = feature_importance_df.loc[feature_importance_df.feature.isin(cols)]\n",
    "\n",
    "    plt.figure(figsize=(14,26))\n",
    "    sns.barplot(x=\"importance\", y=\"feature\", data=best_features.sort_values(by=\"importance\",ascending=False))\n",
    "    plt.title('LightGBM Features (averaged over folds)')\n",
    "    plt.tight_layout()\n",
    "    plt.savefig('lgbm_importances.png')\n",
    "\n",
    "    return models\n",
    "models = run_lgbm(train_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "_kg_hide-output": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Memory usage of dataframe is 954.38 MB\n",
      "Memory usage after optimization is: 199.59 MB\n",
      "Decreased by 79.1%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py:16: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n",
      "of pandas will change to not sort by default.\n",
      "\n",
      "To accept the future behavior, pass 'sort=False'.\n",
      "\n",
      "To retain the current behavior and silence the warning, pass 'sort=True'.\n",
      "\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Memory usage of dataframe is 23.53 MB\n",
      "Memory usage after optimization is: 11.18 MB\n",
      "Decreased by 52.5%\n"
     ]
    }
   ],
   "source": [
    "# read test\n",
    "test_df = pd.read_csv('../../Large_output/test_df_new.csv')\n",
    "row_ids = test_df[\"row_id\"]\n",
    "# feature engineering\n",
    "test_df = features_engineering(test_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "df7bdead33d8463fa6e6ce109733595f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, max=120), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "41697600\n",
      "We are done!\n"
     ]
    }
   ],
   "source": [
    "def predictions(models, iterations = 120):\n",
    "    # split test data into batches\n",
    "    set_size = len(test_df)\n",
    "    batch_size = set_size // iterations\n",
    "    meter_reading = []\n",
    "    for i in tqdm(range(iterations)):\n",
    "        pos = i*batch_size\n",
    "        fold_preds = [np.expm1(model.predict(test_df[features].iloc[pos : pos+batch_size])) for model in models]\n",
    "        meter_reading.extend(np.mean(fold_preds, axis=0))\n",
    "\n",
    "    print(len(meter_reading))\n",
    "    assert len(meter_reading) == set_size\n",
    "    submission = pd.read_csv('../../Resources/sample_submission.csv')\n",
    "    submission['meter_reading'] = np.clip(meter_reading, a_min=0, a_max=None) # clip min at zero\n",
    "    submission.to_csv('fe2_lgbm.csv', index=False)\n",
    "    print('We are done!')\n",
    "predictions(models)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "0e63a5a32f0a47d7a2126c8f0f2187cc": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "IntProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "100%",
       "description_tooltip": null,
       "layout": "IPY_MODEL_eb44d2ca55024af6a624f2e7ed6871d3",
       "max": 5,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_50b868134fbb434f906523b9e25c27d1",
       "value": 5
      }
     },
     "1c18e436eec04f2cbb6b587330ad1341": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "443bad9ef0a64a6cba7c3ab486efc01e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "4f667e09a2af47cd89be0d1195dd8481": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": "initial"
      }
     },
     "50b868134fbb434f906523b9e25c27d1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": "initial"
      }
     },
     "5b4f1a713c134102824881d60a5946f4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_1c18e436eec04f2cbb6b587330ad1341",
       "placeholder": "​",
       "style": "IPY_MODEL_bbbab120297c463e9a40a371294791d1",
       "value": " 120/120 [4:47:14&lt;00:00, 143.62s/it]"
      }
     },
     "79834674b42c48879236fd2012139e94": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_0e63a5a32f0a47d7a2126c8f0f2187cc",
        "IPY_MODEL_b060bb1544ea48e6905e1718769361d7"
       ],
       "layout": "IPY_MODEL_a99bc5fc423f467ca19c261f9f3d71e6"
      }
     },
     "8b0206f4d00345a49ad90bf0cce60f8a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "9c782efdfe16454380de12d411a81b85": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "IntProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "100%",
       "description_tooltip": null,
       "layout": "IPY_MODEL_e7900c3a27574e818766956b1dd6870b",
       "max": 120,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_4f667e09a2af47cd89be0d1195dd8481",
       "value": 120
      }
     },
     "a5dc78e2175d447b880b12b64a1d0329": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a99bc5fc423f467ca19c261f9f3d71e6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "b060bb1544ea48e6905e1718769361d7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_8b0206f4d00345a49ad90bf0cce60f8a",
       "placeholder": "​",
       "style": "IPY_MODEL_443bad9ef0a64a6cba7c3ab486efc01e",
       "value": " 5/5 [2:11:50&lt;00:00, 1582.02s/it]"
      }
     },
     "bbbab120297c463e9a40a371294791d1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "df7bdead33d8463fa6e6ce109733595f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_9c782efdfe16454380de12d411a81b85",
        "IPY_MODEL_5b4f1a713c134102824881d60a5946f4"
       ],
       "layout": "IPY_MODEL_a5dc78e2175d447b880b12b64a1d0329"
      }
     },
     "e7900c3a27574e818766956b1dd6870b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "eb44d2ca55024af6a624f2e7ed6871d3": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
